package Year21_Month10.day1030;

public class Queue2<E>{
    // 双向链表节点
    public static class ListNode<E>{
        ListNode<E> next;
        ListNode<E> prev;
        E value;

        ListNode(E value){
            this.value = value;
        }
    }

    ListNode<E> first;   // 队头
    ListNode<E> last;    // 队尾
    int size = 0;

    // 入队列---向双向链表位置插入新节点
    public void offer(E e){
        ListNode<E> newNode = new ListNode<>(e);
        if(first == null){
            first = newNode;
            // last = newNode;
        }else{
            last.next = newNode;
            newNode.prev = last;
            // last = newNode;
        }

        last = newNode;
        size++;
    }

    // 出队列---将双向链表第一个节点删除掉
    public E poll(){
        // 1. 队列为空
        // 2. 队列中只有一个元素----链表中只有一个节点---直接删除
        // 3. 队列中有多个元素---链表中有多个节点----将第一个节点删除
        E value = null;
        if(first == null){
            return null;
        }else if(first == last){
            last = null;
            first = null;
        }else{
            value = first.value;
            first = first.next;
            first.prev.next = null;
            first.prev = null;
        }
        --size;
        return value;
    }

    // 获取队头元素---获取链表中第一个节点的值域
    public E peek(){
        if(first == null){
            return null;
        }

        return first.value;
    }

    public int size() {
        return size;
    }

    public boolean isEmpty(){
        return first == null;
    }

    public static void main(String[] args) {
        Queue2<Integer> q = new Queue2<>();
        q.offer(1);
        q.offer(2);
        q.offer(3);
        q.offer(4);
        q.offer(5);
        q.offer(6);
        System.out.println(q.size());
        System.out.println(q.peek());

        q.poll();
        q.poll();
        q.poll();
        q.poll();
        q.poll();
        System.out.println(q.size());
        System.out.println(q.peek());
    }
}
